package com.adee.juc;

/**
 * Unsafe 是用于扩展 Java 语言表达能力、便于在更高层（Java 层）代码里实现原本要在更低层（C 层）实现的核心库功能用的。这些功能包括直接内存的申请/释放/访问，低层硬件的 atomic/volatile 支持，创建未初始化对象，通过偏移量操作对象字段、方法、实现线程无锁挂起和恢复等功能。
 *
 * 所谓Java对象的“布局”就是在内存里Java对象的各个部分放在哪里，包括对象的实例字段和一些元数据之类。Unsafe里关于对象字段访问的方法把对象布局抽象出来，它提供了objectFieldOffset()方法用于获取某个字段相对Java对象的“起始地址”的偏移量，也提供了getInt、getLong、getObject之类的方法可以使用前面获取的偏移量来访问某个Java对象的某个字段。
 *
 * Unsafe作用可以大致归纳为：
 *
 * 内存管理，包括分配内存、释放内存等。
 * 非常规的对象实例化。
 * 操作类、对象、变量。
 * 自定义超大数组操作。
 * 多线程同步。包括锁机制、CAS操作等。
 * 线程挂起与恢复。
 * 内存屏障。
 *
 */
public class Test003_Unsafe {
    public static void main(String[] args) throws Exception{
//        Unsafe unsafe = getUnsafe();

    }

    // 通过反射获取静态变量实例
//    public static Unsafe getUnsafe() throws NoSuchFieldException, IllegalAccessException {
//        Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe");
//        theUnsafe.setAccessible(true);
//        Unsafe u = (Unsafe)theUnsafe.get(null);
//        theUnsafe.setAccessible(false);
//        return u;
//    }
}
